﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StackVsArray
{
	class StackArray
	{
		// максимальный размер стека
		private int _maxSize;
		// массив элементов стека
		private Object[] items;
		// индекс верхнего элемента в стеке
		private int _top = -1;
		// максимальный размер стека по умолчанию
		public readonly static int MaxSize = 100;

		// конструктор по умолчанию
		public StackArray() 
		{ 
			_maxSize = MaxSize;
			items = new Object[_maxSize];
			return;
		}

		// конструктор с параметром Size
		public StackArray(int nSize) 
		{
			_maxSize = nSize;
			items = new Object[_maxSize];
			return;
		}

		// свойство получающее "размер стека"
		public int Size
		{
			get
			{
				return (_top + 1);
			}
		}

		// свойство проверки на "пустой стек"
		public bool IsEmpty
		{
			get
			{
				return (_top < 0);
			}
		}

		// метод добавления элемента в стек
		public void Push(Object obj) 
		{ 
			// Если достигнуто максимальное значение - выбросим исключение и выходим
			if (Size == _maxSize)
				throw new Exception("Достигнут максимальный размер стека");

			// добавим элемент в стек
			items[++_top] = obj;
		}

		// Вернуть верхний элемент из стека
		public Object Top() 
		{ 
			// Если стек пуст - выбрасываем исключение и выходим
			if (IsEmpty)
				throw new Exception("Стек пуст!");

			// возвращаем верхний элемент стека по индексу вершины
			return items[_top]; 
		}


		// свойство извлекающее элемент из стека (число элементов в стеке уменьшается)
		public Object Pop()
		{ 
			Object stackElement; 
			if (IsEmpty)
				throw new Exception("Стек пуст!");
			stackElement = items[_top];
			items[_top--] = null; // обнулим содержимое элемента массива (для утилизации памяти коллектором)
			return stackElement;
		}

		// метод выводит элементы стека сверху вниз
		public void Print()
		{
			// Если стек пуст - выбрасываем исключение и выходим
			if (IsEmpty)
				throw new Exception("Стек пуст!");

			for (int i = _top; i >= 0; i--)
				Console.WriteLine(items[i]);
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			// создадим стек
			StackArray arrStack = new StackArray(10);
			// заполним стек элементами
			arrStack.Push(10);
			arrStack.Push(10.345);
			arrStack.Push("20");
			arrStack.Pop();			// вытолкнем элемент из стека
			arrStack.Push(30);
			// выведем элементы стека
			arrStack.Print();
			Console.ReadKey(true);
		}
	}
}
